import { CSSProperties, ReactNode, ButtonHTMLAttributes } from 'react';

/**
 * @typedef {'left' | 'right'} IconPosition определяет позицию иконки
 */
export type IconPosition = 'left' | 'right';

/**
 * @typedef {'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'link'} Variant описывает цвет кнопки
 */
export type Variant =

  | 'primary'

  | 'secondary'

  | 'success'

  | 'danger'

  | 'warning'

  | 'info'

  | 'dark'

  | 'link'
;

/**
 * @typedef {'lg' | 'sm'} Dimension определяет размер кнопки
 */
export type Dimension = 'lg' | 'sm';

/**
 * @typedef {Object} IButtonProps определяет параметры компонента Button
 * @property {ReactNode} children - дочерние элементы компонента
 * @property {string} className - класс компонента
 * @property {CSSProperties} style - стили компонента
 * @property {Variant} variant - вариант цвета кнопки
 * @property {Dimension} dimension - размер кнопки
 * @property {() => void} onClick - обработчик клика по кнопке
 * @property {boolean} disabled - отключение кнопки
 * @property {boolean} round - флаг указывает на то, является ли кнопка круглой
 * @property {ReactNode} icon - иконка кнопки
 * @property {IconPosition} iconPosition - позиция иконки
 * @property {boolean} outline - флаг указывает на то, является ли кнопка контурной
 */
export interface IButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
  children?: ReactNode;
  className?: string;
  style?: CSSProperties;
  variant?: Variant;
  dimension?: Dimension;
  onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
  disabled?: boolean;
  round?: boolean;
  icon?: ReactNode;
  iconPosition?: IconPosition;
  outline?: boolean;
}

/**
 * @typedef {Object} IStyledButtonProps определяет параметры компонента StyledButton
 * @property {Variant} variant - вариант цвета кнопки
 * @property {boolean} round - флаг указывает на то, является ли кнопка круглой
 * @property {Dimension} dimension - размер кнопки
 * @property {boolean} outline - флаг указывает на то, является ли кнопка контурной
 */
export type IStyledButtonProps = Pick<IButtonProps, 'variant' | 'round' | 'dimension' | 'outline'>;
